#include "setdistancias.h"
#include "ui_setdistancias.h"

#include <iostream>
using namespace std;

setDistancias::setDistancias(QWidget *parent, list<string> alternativas, float ** distancias) :
    QDialog(parent),
    ui(new Ui::setDistancias)
{
    ui->setupUi(this);
    this->alternativas = alternativas;
    this->distancias = distancias;
    this->modificando=true;

    ui->tableWidget->clear();

    int i=0;
    for(list<string>::iterator it=alternativas.begin();it!=alternativas.end();it++){
        ui->tableWidget->insertRow(ui->tableWidget->rowCount());
        ui->tableWidget->insertColumn(ui->tableWidget->columnCount());

        ui->tableWidget->setHorizontalHeaderItem(i,new QTableWidgetItem(QString(it->c_str())));
        ui->tableWidget->setVerticalHeaderItem(i,new QTableWidgetItem(QString(it->c_str())));
        i++;
    }

    for(int i=0;i<alternativas.size();i++){ //se inicializan distancias en infinito
        for(int j=0;j<alternativas.size();j++){
            QTableWidgetItem *newItem;

            if(i==j){ //si fila y columna coinciden es distancia entre una misma ciudad
                newItem = new QTableWidgetItem(QString("0"));
                newItem->setFlags(newItem->flags() & (Qt::ItemIsEditable));
            } else {
                if(distancias[i][j]==-1){
                    newItem = new QTableWidgetItem(QString("INF"));
                    //newItem->setFlags(newItem->flags() & (~Qt::ItemIsEditable));
                } else {
                    newItem = new QTableWidgetItem(QString::number(distancias[i][j]));
                    //newItem->setFlags(newItem->flags() & (~Qt::ItemIsEditable));
                }
            }
            ui->tableWidget->setItem(i,j,newItem);
        }
    }
    this->modificando=false;
}

setDistancias::~setDistancias()
{
    delete ui;
}

void setDistancias::on_tableWidget_itemChanged(QTableWidgetItem* item)
{
    if(!this->modificando){
        this->modificando=true;
        int row=ui->tableWidget->row(item);
        int column=ui->tableWidget->column(item);

        if(item->text()!="INF"){
            bool check;
            float value=item->text().toFloat(&check);
            if(!check){
                item->setText(this->lastValue);
            } else {
                if(value < 0){
                    item->setText(this->lastValue);
                } else {
                    QTableWidgetItem * newItem = new QTableWidgetItem(item->text());
                    ui->tableWidget->setItem(column,row,newItem);  //se copia el valor en celda opuesta
                    this->distancias[row][column]=item->text().toFloat();
                    this->distancias[column][row]=item->text().toFloat();
                }
            }
        } else {  //el valor es infinito, no hay arista entre el par de nodos
            QTableWidgetItem * newItem = new QTableWidgetItem(item->text());
            ui->tableWidget->setItem(column,row,newItem);
            this->distancias[row][column]=_INF_;
            this->distancias[column][row]=_INF_;
        }
        this->modificando=false;
    }
}

void setDistancias::on_tableWidget_itemClicked(QTableWidgetItem* item)
{
    this->lastValue = item->text();
}

void setDistancias::on_pushButton_clicked()
{
    this->accept();
}
